package fr.uparis10.miage.classic.m1.p3;

import java.util.ArrayList;
import fr.uparis10.miage.m1p1.employes.ChefProjet;
import fr.uparis10.miage.m1p1.employes.DirecteurProjet;
import fr.uparis10.miage.m1p1.employes.Ingenieur;
import fr.uparis10.miage.m1p1.core.Employe;
import fr.uparis10.miage.m1p1.employes.DirecteurDepartement;
import fr.uparis10.miage.m1p1.core.Projet;

public class Departement {
	/* nom du departement */
	private String nom;
	/* liste employe */
	private ArrayList<Employe> empl;
	/* liste projet */
	private ArrayList<Projet> proj;

	/* constructeur fixant le nom du departement */
	public Departement(String nom) {
		this.nom = nom;
		/* liste des employés du departement */
		empl = new ArrayList<Employe>();
		/* liste des projets affectés au departement */
		proj = new ArrayList<Projet>();
	}

	/* chiffre d'affaire du departement */
	public double rendreCA() {
		double ca = 0;
		for (Projet e : proj) {
			/* faire la somme des chiffre d'affaire de chaque projet */
			ca += e.getChiffreAffaire();
		}
		return ca;
	}
    
	/* fournir le nom de departement */
	public String getNom() {
		return nom;
	}

	/* la liste des employés affectés au departement */
	public ArrayList<Employe> getEmploye() {
		return empl;
	}

	/* la liste des projets affectés au departement */
	public ArrayList<Projet> getProjet() {
		return proj;
	}

	/* nombre d'ingenieurs affectés au departement */
	public int getNbIngenieur() {
		int nb = 0;
		for (Employe e : empl) {
			if (e instanceof Ingenieur)
				nb++;

		}
		return nb;
	}

	/* liste des Ingenieurs */
	public ArrayList<Ingenieur> getIngenieur() {
		ArrayList<Ingenieur> ing = new ArrayList<Ingenieur>();
		for (Employe e : empl)
			if (e instanceof Ingenieur)
				ing.add((Ingenieur) e);
		return ing;
	}

	/* le nombre total d'employés du departement */
	public int getNbEmploye() {
		return empl.size();
	}

	/* Directeur de Departement */
	public DirecteurDepartement getDirecteurDepartement() {
		for (Employe e : empl)
			/*
			 * ce rassurer que l'instance employe indexé est un Directeur de
			 * departement
			 */
			if (e instanceof DirecteurDepartement)
				return (DirecteurDepartement) e;
		return null;
	}

	/* les chefs de projet du departement */
	public ArrayList<ChefProjet> getChefProjet() {
		ArrayList<ChefProjet> cp = new ArrayList<ChefProjet>();
		for (Employe e : empl) {
			/* ce rassurer que l'instance employe indexé est un chef de projet */
			if (e instanceof ChefProjet)
				cp.add((ChefProjet) e);
		}
		return cp;
	}

	/* les Directeurs de projet du departement */
	public ArrayList<DirecteurProjet> getDirectProjet() {
		ArrayList<DirecteurProjet> dp = new ArrayList<DirecteurProjet>();
		for (Employe e : empl) {
			/*
			 * ce rassurer que l'instance employe indexé est un Directeur de
			 * projet
			 */
			if (e instanceof DirecteurProjet)
				dp.add((DirecteurProjet) e);
		}
		return dp;
	}

	/* les employe du departement et leur qualification sous forme de chaine */
	public String afficheEmploye() {
		StringBuffer tmp = new StringBuffer();
		tmp.append(nom);
		for (Employe e : empl) {
			/* toString d'employe a redefinir */
			tmp.append(e.toString());
			tmp.append("\n\n");
		}
		/* retourner la chaine mofiable sous forme de chaine non modifiable */
		return tmp.toString();
	}
	/*renvoie sous forme de chaine non modifiable les employés par projet*/
	public String afficheProjetEmploye(){
		StringBuffer tmp = new StringBuffer("\n");
		for(Projet p:proj){
			tmp.append(p.toString());
		    tmp.append("\n\n");
		}
		return tmp.toString();
	}

	/* le departement, ces employés et ces projets */
	public String toString() {
		StringBuffer tmp = new StringBuffer();
		tmp.append("\n");
		tmp.append(afficheEmploye());
		for (Projet p : proj){
			tmp.append("\n");
			/* idem pour toString d projet */
			tmp.append(p.toString());
			tmp.append("\n\n");
		}
		return tmp.toString();
	}
	/*compare deux departement via leur nom*/
    public boolean equals(Departement d){
    	return(this.getNom().equalsIgnoreCase(d.getNom()));
    	
    }
	/**
	 * Adds an employe to the department list
	 * 
	 * @param newEmpl
	 * @return
	 */
    /*ajout d'un nouveau employé au departement*/
	public boolean addEmploye(Employe newEmpl) {
		if (empl.contains(newEmpl)) {
			return false;
		}
		return empl.add(newEmpl);
	}

	/**
	 * Tries to remove en employe from the department list
	 * 
	 * @param newEmpl
	 * @return
	 */
	/*suppresssion d'un employé du departement*/
		public boolean removeEmploye(Employe newEmpl) {
		return empl.remove(newEmpl);
	}
	/*ajout d'un nouveau projet*/
	public boolean addProjet(Projet newProjet){
		if(proj.contains(newProjet)){
			return false;
		}
		return proj.add(newProjet);
	}
}
